package com.bbva.kyfb.kyfbbofo;

import java.util.GregorianCalendar;

import org.springframework.stereotype.Component;

@Component
public class TLSBGeneradorId {
	
	public TLSBGeneradorId() {

	}

	private String generarTokenDummy(int posiciones) {
		StringBuffer sb = new StringBuffer("");
		for (int i = 0; i < posiciones; i++) {
			sb.append("0");
		}
		return sb.toString();
	}

	/**
	 * El Resultado contiene la forma 0...0XXXXX siendo XXXX el timestamp en
	 * milis
	 */
	public String generar(int posiciones) {
		GregorianCalendar gc = new GregorianCalendar();
		long mili = gc.getTimeInMillis();

		StringBuffer id = new StringBuffer();
		id.append(generarTokenDummy(20));
		id.append(mili);

		int longitudTotal = id.length();
		return id.substring(longitudTotal - posiciones, longitudTotal);

	}

	/**
	 * Construye id de las posiciones pasadas como parametros , si el id
	 * contiene informacion no significativa 0 por la izquierda se concatenan a
	 * la derecha de id tantas posiciones del logon como sea necesario del logon
	 * concatenado se eliminan todas las letras que pudieran existir
	 */
	public String generarConLogon(int posiciones, String logon) {
		String id = generar(posiciones);
		logon = quitarLetras(logon.trim());
		// Pasamos id a long y a string para truncar los 0 de la izquierda
		id = new Long(id).toString();
		int tamId = id.length();
		// Si quedan espacios libres los rellenamos con la parte posterior del
		// logon
		if (tamId < posiciones) {
			String tokenLogon = generarTokenDummy(posiciones) + logon.trim();
			tokenLogon = tokenLogon.substring(tokenLogon.length()
					- (posiciones - tamId), tokenLogon.length());
			id = id + tokenLogon;

		}
		return id;
	}

	/**
	 * Devuelve la cadena recibida eliminando las letras que contenga (devuelve
	 * los numeros)
	 */
	private String quitarLetras(String cadena) {
		StringBuffer sb = new StringBuffer("");
		char[] aCadena = cadena.toCharArray();
		for (int i = 0; i < aCadena.length; i++) {
			if (Character.isDigit(aCadena[i])) {
				sb.append(aCadena[i]);
			}
		}
		return sb.toString();
	}
}
